#include<iostream>
#include<vector>
#include<ctime>
#include<string>
#include<pthread.h>
#include<unistd.h>
int ticket = 8000;
//5.简单一点可以定义全局锁：
pthread_mutex_t glock = PTHREAD_MUTEX_INITIALIZER;

//2.定义一个抢票的函数：
void* bagTicket(void* atr)
{
    std::string name = *(std::string*)atr;
    while(true)
    {
        //6.加锁：
        pthread_mutex_lock(&glock);
        if(ticket > 0)
        {
            usleep(1000);//这里相当于1ms，即抢票需要花费的时间
            printf("%s get a ticket: %d\n", name.c_str(), ticket);
            ticket--;
            //7.1 一个线程抢到票解锁：
            pthread_mutex_unlock(&glock);
        }
        else
        {
            std::cout << "no ticket!!!" << std::endl;
            //7.2 没抢到票也得解锁：
            pthread_mutex_unlock(&glock);
            break;
        }
    }
    return atr;
}

int main()
{
    int begin = 0, end = 0;
    std::vector<pthread_t> vt;
    for(int i=0; i<4; i++)
    {
        //1.创建线程：
        std::string* name = new std::string("thread-");
        (*name) += std::to_string(i+1); 

        pthread_t tid = 0;
        begin = clock();
        pthread_create(&tid, nullptr, bagTicket, (void*)name);
        vt.push_back(tid);
    }

    for(auto& k : vt)
    {
        //3.阻塞等待：
        std::string* ret = nullptr;
        pthread_join(k, (void**)(&ret));

        //4.然后释放堆上的空间：
        delete ret;
    }
    end = clock();
    std::cout << "整个过程耗时->" << end-begin << std::endl;
    return 0;
}
